
#include "prep_img_ipp.h"

/**
 * 预处理图像，包括在保持宽高比的情况下调整图像大小，并创建输入 blob。
 *
 * @param images
 * @param target_width 目标图像宽度。
 * @param target_height 目标图像高度。
 * @param mean_val 用于归一化的均值值。
 * @return cv::Mat 处理后的图像 blob。
 */
std::vector<cv::Mat> preprocess_image(
    std::vector<cv::Mat>& images,
    const int target_width,
    const int target_height,
    const cv::Scalar& mean_val = cv::Scalar(0, 0, 0))
{
    std::vector<cv::Mat> preprocessed_images; // 创建一个向量来存储预处理后的图像

    // 遍历所有图像，进行预处理
    for (const auto& img : images) {
        cv::Mat letterbox_img;
        int col = img.cols; // 获取图像宽度
        int row = img.rows; // 获取图像高度
        int _max = MAX(col, row); // 获取最大边长
        letterbox_img = cv::Mat::zeros(_max, _max, CV_8UC3); // 创建一个黑色背景的正方形图像
        img.copyTo(letterbox_img(cv::Rect(0, 0, col, row))); // 将原始图像复制到黑色背景上

        // 创建输入 blob
        cv::Mat blob = cv::dnn::blobFromImage(
            letterbox_img, 1.0 / 255.0,
            cv::Size(target_width, target_height),
            mean_val, true);
        preprocessed_images.push_back(blob); // 将预处理后的图像添加到向量中
    }

    // 返回包含所有预处理后图像的向量
    return preprocessed_images;
}